E) Const

Const
- const non-member variable
- const member variable
- const pointer variable
- const member function(method)
const non-member variable
변할 수 없는 상수임을 의미하며, 선언시에 초기화 해주어야 한다.
const int num=1;
int const num=1; // (const non-member varibale )
num=2; // error
const member variable
const 변수는 반드시 선언 시 초기화 해야 한다.(초기화 하지 않을 경우, compile error 발생)
class의 멤버 변수를 const로 선언 시, 초기화 리스트(Initialize List)를 사용해야 한다.
class Foo{
const int num;
Foo(void): num(1) {} // const int num=1;
};
class Bar{
const int num;
Bar(void){
num=1; // Compile Error
}
}
const member variable에 대하여서 초기화 리스트로 초기화 할 경우, 선언과 동시에 초기화 함과 동일한 의미이다.

하지만 생성자 내부 함수에서 초기화를 시도할 경우,
이는 초기화가 아닌 const int num; 을 선언한 후,
num=1; 을 시도함과 같다. 따라서 2번의 compile error 출력

class 내부에서 const int num; 을 선언해 줌은 메모리를 할당한 것이 아닌,
컴파일러에게 class의 구조를 알려줌이다.

초기화 리스트를 통한 초기화는 객체 생성 시, num 메모리 할당 후 바로 초기화 함
C++11부터는 아래와 같이 선언 및 초기화가 가능하다.
class Foo{
const int num=1; // after C++11
}
보통은 위처럼 선언하지 않고 static을 이용해서 선언해 주는 것이 맞다.
static으로 선언 시, 객체 생성시 마다 num을 생성하지 않고,
메모리 상에 한번만 할당하고 공유해서 사용함
const pointer variable
pointer에 const를 사용할 때 두 가지 경우가 존재한다.
1. const 위치가 맨 앞에 있으며, 포인터 변수가 가리키는 값에 대하여 상수화
2. const 위치가 type과 변수 이름 사이에 있으면서, 포인터 변수 자체를 상수화

2번째 사용방법은 C++의 reference와 동작이 유사하기 때문에 잘 사용되지 않음
참조자(reference)는 애초에 참조하는 대상을 변경할 수 없음
// 1
int num=1;
const int* ptr=# // *ptr
*ptr=2; // compile error
num=2; // OK
// 2
int num1=1;
int num2=2;
int* const ptr=&num1; // ptr
ptr=&num2; // compile error
//
int num=1;
const int* const ptr=#
// same as
const int& ref=num;
const member function(method)
const member function은 class의 멤버 함수만 const로 상수화 시킬 수 있고,
non-member function은 const 함수로 선언이 불가능하다.

해당 멤버 함수 내에서는 모든 멤버 변수를 상수화 시킴을 의미한다.
지역 변수는 변경 가능
int GetString(void) const; // compile error; class member function
class Foo{
int num=1;
int GetNum(void) const{
int a=1;
a++; //
num++; // compile error;
return num;
}
}